<?php
declare (strict_types = 1);

namespace app\admin\model\admin;

use think\Model;
use app\common\facade\TreeHelper;

/**
 * @mixin \think\Model
 */
class Dept extends DeptBase
{

    /**
     * 修改器：部门的 Code 统一为大写字母
     * @param $value
     * @return string
     */
    public function setCodeAttr($value): string
    {
        return strtoupper($value);
    }

    /**
     * 修改器：pid为空时，设置为0
     * @param $value
     * @return string
     */
    public function setPidAttr($value): int
    {
        return $value === null ? 0 : $value;
    }

    /**
     * 一个部门有多个用户
     * @return \think\model\relation\HasMany
     */
    public function users(): \think\model\relation\HasMany
    {
        return $this->hasMany(User::class, 'dept_id', 'id');
    }

    /**
     * 一个部门属于一个上级部门
     * @return \think\model\relation\BelongsTo
     */
    public function parent(): \think\model\relation\BelongsTo
    {
        return $this->belongsTo(Dept::class, 'pid', 'id');
    }

    /**
     * 一个部门有多个下级部门
     * @return \think\model\relation\HasMany
     */
    public function children(): \think\model\relation\HasMany
    {
        return $this->hasMany(Dept::class, 'pid', 'id');
    }

    public static function onBeforeUpdate(Model $model): void
    {
        parent::onBeforeUpdate($model);
        // 自动补齐父部门信息
        if ($model->isChange('pid')) {
            self::generatePidsAndPnames($model);
        }
    }

    public static function onBeforeInsert(Model $model): void
    {
        parent::onBeforeInsert($model);
        // 自动补齐父部门信息
        if ($model->isChange('pid')) {
            self::generatePidsAndPnames($model);
        }
    }

    private static function generatePidsAndPnames(Model $model): void
    {
        $model->pids =  TreeHelper::findParentIds($model->pid,$model->getName());
        $model->pnames = TreeHelper::findParentNames($model->pid,$model->getName(),'-');
    }

    // end
}